<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
var obj1 = {
    name: '老王',
    age: 30,
    sex: '男'
}

// 获取obj对象自身属性的描述符对象
// Object.getOwnPropertyDescriptor(obj,property)
// console.log( Object.getOwnPropertyDescriptor(obj1,'name') );
// {value: '老王', writable: true, enumerable: true, configurable: true}

// console.log( Object.getOwnPropertyDescriptor(obj1,'age') );
// {value: 30, writable: true, enumerable: true, configurable: true}


// 面试题：
// 显式声明变量和隐式声明变量的区别有哪些？
// 1.显式声明变量使用var声明，隐式声明变量不使用var声明
// 2.严格模式不能使用隐式声明
// 3.显式声明变量会有声明提升，隐式声明变量没有声明提升
// 4.显式声明有全局和局部作用域，隐式声明只有全局作用域
// 5.显式声明变量的configurable: false，隐式声明变量的configurable: true
// 6.显式声明的变量不能删除，隐式声明的变量可以删除

var hehe = '呵呵';// 显式声明变量
haha = '哈哈';// 隐式声明变量
console.log( Object.getOwnPropertyDescriptor(window,'hehe') );
// {value: '呵呵', writable: true, enumerable: true, configurable: false}
console.log( Object.getOwnPropertyDescriptor(window,'haha') );
// {value: '哈哈', writable: true, enumerable: true, configurable: true}

// delete window.hehe;
// delete window.haha;
// console.log( hehe );// '呵呵'
// console.log( haha );// 报错

var str = 'hello';
console.log( Object.getOwnPropertyDescriptor(str,'length') );
// {value: 5, writable: false, enumerable: false, configurable: false}

</script>
</body>
</html>